<?php

/*
 * Абстрактный класс:
 * предоставление доступа к базе данных
 *
 * Выполняет подключение к базе данных и централизованно предоставляет доступ
 * к объекту интерфейса бд
 *
 * - Инициализация: DB::connect();
 * - Состояние: DB::state();
 *
 * - Использование: DB::$mysqli->query($sql); (стандартный PHP объект Mysqli)
 */
abstract class DB {

    private static $DB_HOST = "sql";    // сервер БД
    private static $DB_LOGIN = "reports";     // имя пользователя БД
    private static $DB_PASSWORD = "reports";  // пароль БД
    private static $DB_NAME = "reports";      // имя БД

    private static $_connected = false;         // флаг соединения
    private static $_state = true;              // флаг состояния класса
    private static $_error = '';                // текущее сообщение об ошибке
    public static $mysqli;                      // интерфейс подключения к БД
    public static $lastReqState = true;         // состояние последнего запроса

    /**
     * Возвращает статус соединения
     * @return boolean true если соединение установлено.
     */
    public static function state() {
        $out = self::$_connected && self::$_state;
        return $out;
    }




    /**
     * Соединение с базой данных
     * В случае ошибки повторная автоматическая попытка соединения не производится.
     * @return boolean true если соединение установлено.
     */
    public static function connect() {
        if (self::$_connected) return true;
        if (!self::$_state) return false;
        self::$mysqli = new mysqli(self::$DB_HOST, self::$DB_LOGIN, self::$DB_PASSWORD, self::$DB_NAME);

        if (mysqli_connect_errno()) {
            self::setError('Ошибка при подключении к БД: '.mysqli_connect_error());
            self::$_state = false;
            return false;
        }

        self::$mysqli->query('SET NAMES UTF8');

        self::$_connected = true;
        self::reset();
    }


    /**
     * Закрытие соединения с БД
     */
    public static function close() {
        if (!self::$_connected) return ;
        self::$mysqli->close();
        self::$_connected = false;
        self::reset();
    }


    /**
     * Сброс состояния ошибки
     */
    public static function reset() {
        self::$_error = '';
        self::$_state = true;
        self::$lastReqState = true;
    }


    /**
     * Установка сообщения об ошибке
     */
    private static function setError($error=''){
        self::$lastReqState = false;
        self::$_error = $error;
	}


    /**
     * Получение сообщения об ошибке в функциях класса
     * @return string Текущее сообщение об ошибке
     */
	public static function getError(){
        return self::$_error;
	}


    public static function query($query) {
        self::$lastReqState = true;
        $res = self::$mysqli->query($query);
        if (self::$mysqli->errno) {
            self::setError(self::$mysqli->error);
            return false;
        }
        return $res;
    }


}




?>